package com.lianrui.core;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.lianrui.commons.exception.BusinessException;
import com.lianrui.core.IDao.OperateType;

/**
 * 功能描述：数据操作接口
 * 
 * @param <P> 分页类型
 * @param <D> Domain 实体类型
 * @param <T> ID Type 编码类型
 */
@SuppressWarnings("unchecked")
public interface IOperate<P, D, T> extends Serializable {
	
	/**
	 * 功能描述：新增实体
	 * @param d 实体对象
	 */
	void add(D d) throws BusinessException;
	
	/**
	 * 功能描述：删除实体
	 * @param id 实体编码数列
	 */
	void delete(T... id) throws BusinessException;
	
	/**
	 * 功能描述：更新实体
	 * @param d 实体对象数列
	 */
	void update(D d) throws BusinessException;
	
	/**
	 * 功能描述：获取唯一实体
	 * @param id 实体编码
	 * @return
	 */
	D unique(T id) throws BusinessException;
	
	/**
	 * 功能描述：通过编码获取实体列表
	 * @param id 实体编码数列
	 * @return
	 */
	List<D> get(T... id) throws BusinessException;
	
	/**
	 * 功能描述：查询实体列表
	 * @param page 分页对象
	 * @return
	 */
	List<D> list(P page) throws BusinessException;
	
	/**
	 * 功能描述：混合体查询
	 * @param Map<String, Object> 条件参数集合
	 * @return
	 */
	List<Map<String, Object>> list(Map<String, Object> condition) throws BusinessException;
	

	/**
	 * 功能描述：查询实体列表
	 * @param page 分页对象
	 * @return
	 */
	int count(P page) throws BusinessException;
	
	/**
	 * 功能描述：数据校验方法
	 * @param opType 操作类型
	 * @param obj 校验对象
	 * @return 校验结果：<pre>
	 * 1、“0”标示校验成功，其他标示失败；
	 * 2、当存在非法或错误数据以及操作的时候，尽量使用异常方式抛出
	 * </pre>
	 * @throws BusinessException
	 */
	int validate(OperateType opType, D d) throws BusinessException;
	
	/**
	 * 功能说明：纯粹实体类，无关联对象的实体查询
	 * @param id 实体编码
	 * @return
	 * @throws BusinessException
	 */
	D pure(T id) throws BusinessException;
}
